&НаКлиенте
Перем УИ_РедакторКодаКлиентскиеДанные Экспорт;
 
#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ЗаполнитьТаблицуПараметров();

	Если Не Параметры.Ключ.Пустая() Тогда

		НастройкиТекстАлгоритма = ХранилищеОбщихНастроек.ПолучитьСписок(Строка(Параметры.Ключ) + "-n1");

		Для Каждого ЭлементСписка Из НастройкиТекстАлгоритма Цикл

			НастройкаТекстАлгоритма = ХранилищеОбщихНастроек.Загрузить(Строка(Параметры.Ключ) + "-n1",
				ЭлементСписка.Значение);
			Элементы.ТекстАлгоритма[ЭлементСписка.Значение] = НастройкаТекстАлгоритма;
		КонецЦикла;

	КонецЕсли;

	ЗаполнитьСпискиВыбораПолейФормы();

	УстановитьВидимостьИДоступность();
	
	// РедакторКода
	УИ_РедакторКодаСервер.ФормаПриСозданииНаСервере(ЭтотОбъект);
	УИ_РедакторКодаСервер.СоздатьЭлементыРедактораКода(ЭтотОбъект, "Алгоритм", Элементы.ПолеТекстАлгоритма);
	// РедакторКода
	
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	УстановитьВидимостьИДоступность();
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	Если ИмяСобытия = "ИзменилсяПараметр" Тогда
		Прочитать();
		ЗаполнитьТаблицуПараметров();
	ИначеЕсли ИмяСобытия = "Обновить" Тогда
		Прочитать();
	ИначеЕсли ИмяСобытия = "ОбновитьКод" Тогда
		Прочитать();
		Записать();
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ГруппаПанельСтраницПриСменеСтраницы(Элемент, ТекущаяСтраница)
	Если Модифицированность И ТекущаяСтраница.Имя <> "ГруппаКод" Тогда
		Записать();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НаКлиентеПриИзменении(Элемент)
	УстановитьВидимостьИДоступность();
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормы_Параметры

&НаКлиенте
Процедура ТаблицаПараметровПередУдалением(Элемент, Отказ)
	ПоказатьВопрос(Новый ОписаниеОповещения("ТаблицаПараметровПередУдалениемЗавершение", ЭтотОбъект,
		Новый Структура("Строка,Параметр", Элемент.ТекущаяСтрока, Элемент.ТекущиеДанные.Параметр)), "Элемент структуры настроек будет удален без возможности  восстановления !"
		+ Символы.ПС + "Продолжить выполнение ? ", РежимДиалогаВопрос.ДаНетОтмена);
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПараметровПередУдалениемЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = КодВозвратаДиалога.Да Тогда
		Если УдалитьПараметрНаСервере(ДополнительныеПараметры.Параметр) Тогда
			Прочитать();
			ЗаполнитьТаблицуПараметров();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПараметровПараметрОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	Если Элемент.Родитель.ТекущиеДанные.ОписаниеТипа = "Таблица значений"
		Или Элемент.Родитель.ТекущиеДанные.ОписаниеТипа = "Двоичные данные" Тогда
		Возврат;
	КонецЕсли;
	Попытка
		Значение = ПолучитьПараметрНаСервере(Элементы.ТаблицаПараметров.ТекущиеДанные.Параметр);
		ПоказатьЗначение( , Значение);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаПараметровПриАктивизацииСтроки(Элемент)
	Если Элемент.ТекущиеДанные = Неопределено Тогда
		Возврат;	
	КонецЕсли;
	Если ВыбранныйПараметр <> Элемент.ТекущиеДанные.Параметр Тогда
		ВыбранныйПараметр = Элемент.ТекущиеДанные.Параметр;	
		ПодключитьОбработчикОжидания("ОтобразитьЗначениеПараметра", 0.1, Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ИзменениеПараметровЗавершение(Результат, ДопПараметры) Экспорт
	
	ПодключитьОбработчикОжидания("ОтобразитьЗначениеПараметра", 0.1, Истина);

КонецПроцедуры


&НаКлиенте
Процедура ОтобразитьЗначениеПараметра()
	
	Если Элементы.ТаблицаПараметров.ТекущиеДанные = Неопределено Тогда
		Возврат;	
	КонецЕсли;
	
	Элементы.ПараметрКоллекция.Видимость = Ложь;
	Элементы.ДекорацияОтступЗначенияПарамета.Видимость = Ложь;
	Элементы.ЗначениеПараметраПростойТип.Видимость = Ложь;

	ОтобразитьЗначениеПараметраСервер(Элементы.ТаблицаПараметров.ТекущиеДанные.Параметр, Элементы.ТаблицаПараметров.ТекущиеДанные.ОписаниеТипа);	
КонецПроцедуры

&НаСервере
Процедура ОтобразитьЗначениеПараметраСервер(ИмяПараметра, ТипПараметраСтроки)
	ВыбОбъект=РеквизитФормыВЗначение("Объект");
	Параметр = ВыбОбъект.ПолучитьПараметр(ИмяПараметра);
    ОписаниеТипа = Новый ОписаниеТипов();
	
	C = Новый Соответствие;
	C.Вставить("Массив", "Коллекция");
	C.Вставить("Структура", "Коллекция");
	C.Вставить("Соответствие", "Коллекция");
	C.Вставить("Таблица значений", "Коллекция");
	C.Вставить("Двоичные данные", "ВнешнийФайл");
	C.Вставить(Неопределено, "ДоступныеТипы");
	ТипПараметра = C.Получить(ТипПараметраСтроки);
	Если ТипПараметра = Неопределено Тогда
		ЗначениеПараметраПростойТип = Параметр;
		Элементы.ЗначениеПараметраПростойТип.Видимость = Истина;
	ИначеЕсли ТипПараметра = "Коллекция" Тогда
		УдаляемыеЭлементы = Новый Массив;
		Для Каждого ЭлементКоллекции Из Элементы.ПараметрКоллекция.ПодчиненныеЭлементы Цикл
			УдаляемыеЭлементы.Добавить(ЭлементКоллекции.Имя);
		КонецЦикла;            
        УИ_РаботаСФормами.УдалитьКолонкиНС(ЭтотОбъект, УдаляемыеЭлементы, "ПараметрКоллекция");		
		Если ТипПараметраСтроки = "Массив" Тогда
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Значение", ОписаниеТипа, "ПараметрКоллекция");
			Т = УИ_ОбщегоНазначения.КоллекцияВТЗ(Параметр);
			ПараметрКоллекция.Загрузить(Т);
		ИначеЕсли ТипПараметраСтроки = "Структура" Тогда
			ОТ = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20, ДопустимаяДлина.Переменная));
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Ключ", ОТ, "ПараметрКоллекция");
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Значение", ОписаниеТипа, "ПараметрКоллекция");
			Т = УИ_ОбщегоНазначения.КоллекцияВТЗ(Параметр);
			ПараметрКоллекция.Загрузить(Т);
		ИначеЕсли ТипПараметраСтроки = "Соответствие" Тогда
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Ключ", ОписаниеТипа, "ПараметрКоллекция");
			УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, "Значение", ОписаниеТипа, "ПараметрКоллекция");
			Т = УИ_ОбщегоНазначения.КоллекцияВТЗ(Параметр);
			ПараметрКоллекция.Загрузить(Т);
		Иначе
			Для Каждого Колонка Из Параметр.Колонки Цикл
				УИ_РаботаСФормами.ДобавитьКолонкуНС(ЭтотОбъект, Колонка.Имя, Колонка.ТипЗначения, "ПараметрКоллекция");
			КонецЦикла;
			ПараметрКоллекция.Загрузить(Параметр);
		КонецЕсли;
		Элементы.ПараметрКоллекция.Видимость = Истина;
	Иначе
		Параметры.ТипПараметра="ВнешнийФайл";
	КонецЕсли;
	Элементы.ДекорацияОтступЗначенияПарамета.Видимость = Истина;	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы
///
&НаКлиенте
Процедура ДобавитьПараметр(Команда)
	П = Новый Структура("Ключ", Объект.Ссылка);
	ОткрытьФорму("Справочник.УИ_Алгоритмы.Форма.ФормаПараметра", П, ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьИмя(Команда)
	Если Элементы.ТаблицаПараметров.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли
	;
	П = Новый Структура("Ключ,ИмяПараметра,Переименовать", Параметры.Ключ,
		Элементы.ТаблицаПараметров.ТекущиеДанные.Параметр, Истина);
	ОткрытьФорму("Справочник.УИ_Алгоритмы.Форма.ФормаПараметра", П, ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЗначение(Команда)
	Если Элементы.ТаблицаПараметров.ТекущиеДанные <> Неопределено Тогда
		Оповещение = Новый ОписаниеОповещения("ИзменениеПараметровЗавершение", ЭтотОбъект);
		П = Новый Структура;
		П.Вставить("Ключ", Параметры.Ключ);
		П.Вставить("ИмяПараметра", Элементы.ТаблицаПараметров.ТекущиеДанные.Параметр);
		П.Вставить("ТипПараметра", Элементы.ТаблицаПараметров.ТекущиеДанные.ОписаниеТипа);
		ОткрытьФорму("Справочник.УИ_Алгоритмы.Форма.ФормаПараметра", П, ЭтотОбъект,,,, Оповещение);
	КонецЕсли;
КонецПроцедуры

///
&НаКлиенте
Процедура ВыполнитьПроцедуру(Команда)
	//TODO При изменении кода при использовании monako не встает признак модифицированности
	//по этому идет запись каждый раз, необходимо выяснить как изменение текста может изменить этот флаг	
	Записать();

	ВремяСтарт = ТекущаяУниверсальнаяДатаВМиллисекундах();

	Ошибка = Ложь;
	СообщениеОбОшибке = "";
	СтруктураПередачи = Новый Структура;
	
	Если Объект.НаКлиенте Тогда
		ВыполнитьАлгоритмНаКлиенте(СтруктураПередачи);
	Иначе
		УИ_АлгоритмыВызовСервера.ВыполнитьАлгоритм(Объект.Ссылка);
	КонецЕсли;

	Элементы.ВыполнитьПроцедуру.Заголовок = "Выполнить процедуру (" + Строка(ТекущаяУниверсальнаяДатаВМиллисекундах()
		- ВремяСтарт) + " мс.)";
КонецПроцедуры

&НаКлиенте
Процедура КонструкторЗапросаПоказать(Команда)
	Конструктор = Новый КонструкторЗапроса;
	ВыделенныйТекст = Элементы.ТекстАлгоритма.ВыделенныйТекст;
	ВесьТекст = Элементы.ТекстАлгоритма.ТекстРедактирования;
	НайтиВесьТекстВКовычках(ВыделенныйТекст, ВесьТекст);
	Конструктор.Текст = СтрЗаменить(ВыделенныйТекст, "|", "");
	ДополнительныеПараметры = Новый Структура("ПервыйВызовКонструктора,ВесьТекст,ВыделенныйТекст", СтрНайти(
		ВыделенныйТекст, "ВЫБРАТЬ") = 0, ВесьТекст, ВыделенныйТекст);
	Оповещение = Новый ОписаниеОповещения("ПолучитьТекстЗапроса", ЭтотОбъект, ДополнительныеПараметры);
	Конструктор.Показать(Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ФорматироватьТекст(Команда)
	Текст = Объект.ТекстАлгоритма;
	Текст = СтрЗаменить(Текст, Символы.ПС, " \\ ");
	Текст = СтрЗаменить(Текст, Символы.Таб, " ");
	Текст = СтрЗаменить(Текст, "=", " = ");
	Текст = СтрЗаменить(Текст, "< =", " <=");
	Текст = СтрЗаменить(Текст, "> =", " >=");
	Для А = 0 По Окр(Sqrt(СтрЧислоВхождений(Текст, "  ")), 0) Цикл
		Текст = СтрЗаменить(Текст, "  ", " ");
	КонецЦикла;
	Текст = СтрЗаменить(Текст, " ;", ";");
	МассивСлов = СтрРазделить(Текст, Символ(32));
	ФормТекст = "";
	СтрокаТаб = "";
	ТипыСлов = Новый Массив;
	ТипыСлов.Добавить(СтрРазделить("ТОГДА,ЦИКЛ,\\", ",")); // перенос справа
	ТипыСлов.Добавить(СтрРазделить("ЕСЛИ,ПОКА,ДЛЯ", ",")); // опер скобки открываются
	ТипыСлов.Добавить(СтрРазделить("КОНЕЦЦИКЛА;,КОНЕЦЕСЛИ;", ",")); // опер скобки закрываются
	ТипыСлов.Добавить(СтрРазделить("ИНАЧЕ,ИНАЧЕЕСЛИ", ",")); // опер скобки внутри
	БылТип = Новый Соответствие;
	Для Ё = 0 По МассивСлов.Количество() - 1 Цикл
		ФорматДо = "";
		ФорматПосле = "";

		ТипСлова = ТипСлова(МассивСлов[Ё], ТипыСлов);

		Если ТипСлова["СкобкаОткрылась"] Тогда
			СтрокаТаб = СтрокаТаб + Символы.Таб;
		КонецЕсли;

		Если ТипСлова["СкобкаВнутри"] Тогда
			ФормТекст = Лев(ФормТекст, СтрДлина(ФормТекст) - 1);
		КонецЕсли;

		Если ТипСлова["СкобкаЗакрылась"] Тогда
			СтрокаТаб = Лев(СтрокаТаб, СтрДлина(СтрокаТаб) - 1);
			ФормТекст = Лев(ФормТекст, СтрДлина(ФормТекст) - 1);
		КонецЕсли;

		Если ТипСлова["ПереносСправа"] И Не БылТип["ПереносСправа"] Тогда
			ФорматПосле = Символы.ПС + СтрокаТаб;
		КонецЕсли;

		ФормТекст = ФормТекст + ФорматДо + МассивСлов[Ё] + Символ(32) + ФорматПосле;

		БылТип = ТипСлова;
	КонецЦикла;

	ФормТекст = СтрЗаменить(ФормТекст, "\\ ", "");
	ФормТекст = СтрЗаменить(ФормТекст, "\\", "");
	Объект.ТекстАлгоритма = ФормТекст;

КонецПроцедуры

&НаКлиенте
Процедура ДобавитьРегламентноеЗадание(Команда)
	Если Объект.НаКлиенте Тогда
		Сообщить(" это клиентская процедура");
		Возврат;
	КонецЕсли;
	СоздатьРегламентноеЗадание();
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРегламентноеЗадание(Команда)
	УдалитьРегламентноеЗаданиеНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьЖурналРегистрации(Команда)
	ПодключитьВнешнююОбработкуНаСервере();
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("Данные", Объект.Ссылка);
	ПараметрыОткрытия.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
	ОткрытьФорму("ВнешняяОбработка.StandardEventLog.Форма", ПараметрыОткрытия);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область РаботаСПараметрами

&НаСервере
Процедура ЗаполнитьТаблицуПараметров()
	ВыбОбъект = РеквизитФормыВЗначение("Объект");
	тПараметров = РеквизитФормыВЗначение("ТаблицаПараметров");
	тПараметров.Очистить();
	СтруктураПараметров = ВыбОбъект.Хранилище.Получить();
	Если Не СтруктураПараметров = Неопределено Тогда
		Для Каждого ЭлементСтруктуры Из СтруктураПараметров Цикл
			НС = тПараметров.Добавить();
			НС.Параметр = ЭлементСтруктуры.Ключ;
			НС.ОписаниеТипа = ПолучитьСтрокуОписаниеТипа(ЭлементСтруктуры.Значение);
		КонецЦикла;
		ЗначениеВРеквизитФормы(тПараметров, "ТаблицаПараметров");
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьСтрокуОписаниеТипа(Значение)
	Если XMLТипЗнч(Значение) <> Неопределено Тогда
		Возврат XMLТип(ТипЗнч(Значение)).ИмяТипа;
	Иначе
		Возврат Строка(ТипЗнч(Значение));
	КонецЕсли;
КонецФункции

&НаСервере
Процедура ДобавитьНовыйПараметрНаСервере(СтруктураПараметра)
	ИзменитьПараметр(СтруктураПараметра);
КонецПроцедуры

&НаСервере
Функция УдалитьПараметрНаСервере(Ключ)
	ВыбОбъект = РеквизитФормыВЗначение("Объект");
	Возврат ВыбОбъект.УдалитьПараметр(Ключ);
КонецФункции

&НаСервере
Функция ПолучитьПараметрНаСервере(НаименованиеПараметра, ЭтоJSON = Ложь)
	ВыбОбъект = РеквизитФормыВЗначение("Объект");
	ЗначениеПолученногоПараметра = ВыбОбъект.ПолучитьПараметр(НаименованиеПараметра);
	Если ТипЗнч(ЗначениеПолученногоПараметра) = Тип("ТаблицаЗначений") Тогда
		

		ЗначениеПолученногоПараметра = ОбщегоНазначения.ТаблицаЗначенийВМассив(ЗначениеПолученногоПараметра);
		ЭтоJSON = Истина;
		ЗаписьJSON = Новый ЗаписьJSON;
		ЗаписьJSON.УстановитьСтроку();
		ЗаписатьJSON(ЗаписьJSON, ЗначениеПолученногоПараметра); 
		СтрокаОтветаJSON = ЗаписьJSON.Закрыть();

		Возврат СтрокаОтветаJSON;	
	КонецЕсли;
	Возврат ЗначениеПолученногоПараметра;
КонецФункции

&НаСервере
Процедура ИзменитьПараметр(НовыеДанные) Экспорт
	НаименованиеПараметра = НовыеДанные.НаименованиеПараметра;
	Если ТипЗнч(НовыеДанные.ЗначениеПараметра) = Тип("Строка") Тогда
		Если Лев(НовыеДанные.ЗначениеПараметра, 1) = "{" Тогда
			Поз = СтрНайти(НовыеДанные.ЗначениеПараметра, "}");
			Если Поз > 0 Тогда
				АдресХранилища = Сред(НовыеДанные.ЗначениеПараметра, Поз + 1);
				ЗначениеПараметра = ПолучитьИЗВременногоХранилища(АдресХранилища);
				РасширениеФайла = СтрЗаменить(Сред(НовыеДанные.ЗначениеПараметра, 2, Поз - 2), Символ(32), "");
				НаименованиеПараметра = "Файл" + ВРег(РасширениеФайла) + "_" + НаименованиеПараметра;
			Иначе
				Если Объект.ВыбрасыватьИсключение Тогда
					ВызватьИсключение "Ошибка при чтении Файла из хранилища ";
				КонецЕсли;
			КонецЕсли;
		Иначе
			ЗначениеПараметра = НовыеДанные.ЗначениеПараметра;
		КонецЕсли;
	Иначе
		ЗначениеПараметра = НовыеДанные.ЗначениеПараметра;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область РаботаСКодом

&НаКлиенте
Процедура ВыделитьОшибку(ТекстОшибки)
	ПозОшибки = СтрНайти(ТекстОшибки, "{(");
	Если ПозОшибки > 0 Тогда
		ПозСкобкаЗакрылась = СтрНайти(ТекстОшибки, ")}", , ПозОшибки);
		Если ПозСкобкаЗакрылась > 0 Тогда
			ПозЗапятая = СтрНайти(Лев(ТекстОшибки, ПозСкобкаЗакрылась), ",", , ПозОшибки);
			Если ПозЗапятая > 0 Тогда
				ТекстНомерСтроки = Сред(ТекстОшибки, ПозОшибки + 2, СтрДлина(Лев(ТекстОшибки, ПозЗапятая)) - СтрДлина(
					Лев(ТекстОшибки, ПозОшибки)) - 2);
			Иначе
				ТекстНомерСтроки = Сред(ТекстОшибки, ПозОшибки + 2, СтрДлина(Лев(ТекстОшибки, ПозСкобкаЗакрылась))
					- СтрДлина(Лев(ТекстОшибки, ПозОшибки)) - 2);
			КонецЕсли;
			// вложенная   ошибка   напр.  запрос
			ПозОшибки2 = СтрНайти(ТекстОшибки, "{(", , , 2);
			Если ПозОшибки2 > 0 Тогда
				ПозСкобкаЗакрылась2 = СтрНайти(ТекстОшибки, ")}", , ПозОшибки2);
				Если ПозСкобкаЗакрылась2 > 0 Тогда
					ПозЗапятая2 = СтрНайти(Лев(ТекстОшибки, ПозСкобкаЗакрылась2), ",", , ПозОшибки2);
					Если ПозЗапятая2 > 0 Тогда
						ТекстНомерСтроки2 = Сред(ТекстОшибки, ПозОшибки2 + 2, СтрДлина(Лев(ТекстОшибки, ПозЗапятая2))
							- СтрДлина(Лев(ТекстОшибки, ПозОшибки2)) - 2);
					Иначе
						ТекстНомерСтроки2 = Сред(ТекстОшибки, ПозОшибки2 + 2, СтрДлина(Лев(ТекстОшибки,
							ПозСкобкаЗакрылась2)) - СтрДлина(Лев(ТекстОшибки, ПозОшибки2)) - 2);
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			Попытка
				НомерСтроки = Число(ТекстНомерСтроки);
				мСтрок = СтрРазделить(Объект.Текст, Символы.ПС, Истина);
				мСтрок[НомерСтроки - 1] = мСтрок[НомерСтроки - 1] + " <<<<<";
				Если ПозОшибки2 > 0 Тогда
					НомерСтроки2 = Число(ТекстНомерСтроки2);
					Ъ = НомерСтроки - 1;
					Пока Ъ >= 0 Цикл
						Если СтрНайти(мСтрок[Ъ], "ВЫБРАТЬ") > 0 Или СтрНайти(мСтрок[Ъ], "Выбрать") > 0 Или СтрНайти(
							мСтрок[Ъ], "выбрать") > 0 Тогда
							мСтрок[Ъ + НомерСтроки2 - 1] = мСтрок[Ъ + НомерСтроки2 - 1] + " <<<<<";
						КонецЕсли;
						Ъ = Ъ - 1;
					КонецЦикла;
				КонецЕсли;
				Объект.Текст = СтрСоединить(мСтрок, Символы.ПС);
			Исключение
				Возврат;
			КонецПопытки;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ВыделитьИзменившийсяКод()
	Модифицированность = Истина;
КонецПроцедуры

&НаКлиенте
Процедура НайтиВесьТекстВКовычках(ВыделенныйТекст, ВесьТекст)
	Если СтрДлина(ВыделенныйТекст) > 10 Тогда // нужен уникальный текст , по хорошему нужно проверить количество включений
		ИщемЗдесь = СтрНайти(ВесьТекст, ВыделенныйТекст);
		НашлиКавычкуДо = 0;
		Для А = 1 По СтрЧислоВхождений(ВесьТекст, """") Цикл
			НашлиКавычкуПосле = СтрНайти(ВесьТекст, """", , , А);
			Если НашлиКавычкуПосле > ИщемЗдесь Тогда
				ВыделенныйТекст = Сред(ВесьТекст, НашлиКавычкуДо + 1, СтрДлина(Лев(Весьтекст, НашлиКавычкуПосле))
					- СтрДлина(Лев(Весьтекст, НашлиКавычкуДо)) - 1);
				Прервать;
			КонецЕсли;
			НашлиКавычкуДо = НашлиКавычкуПосле;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПолучитьТекстЗапроса(Текст, ДополнительныеПараметры) Экспорт
	Если Текст = Неопределено Тогда
		Возврат;
	КонецЕсли;
	МассивСтрок = СтрРазделить(Текст, Символы.ПС);
	ТекстЗапроса = МассивСтрок[0];
	Для Ё = 1 По МассивСтрок.Количество() - 1 Цикл
		ТекстЗапроса = ТекстЗапроса + Символы.ПС + "|" + СокрЛП(МассивСтрок[Ё]);
	КонецЦикла;
	ТекстВставки = "";
	Если ДополнительныеПараметры.ПервыйВызовКонструктора Тогда
		ТекстВставки = "
					   |Запрос = Новый Запрос;
					   |ТекстЗапроса = """ + ТекстЗапроса + """;
															|Запрос.Текст = ТекстЗапроса;";
		Пока Найти(ТекстЗапроса, "&") > 0 Цикл
			ПарметрЗапроса = УИ_АлгоритмыКлиентСервер.ПолучитьПервоеВхождениеСловоБезПрефикса(ТекстЗапроса, "&");
			ТекстВставки = ТекстВставки + "
										  |Запрос.УстановитьПараметр(""" + ПарметрЗапроса + """,@" + ПарметрЗапроса
				+ " );";
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&" + ПарметрЗапроса, "~" + ПарметрЗапроса);
		КонецЦикла;
		Текст = Текст + "
						|Результат = Запрос.Выполнить();
						|Если Не Результат.Пустой() Тогда
						|	Выборка = Результат.Выбрать();
						|	Пока Выборка.Следующий() Цикл
						|	 	// Сообщить("");
						|	КонецЦикла;
						|КонецЕсли;";
	Иначе
		ТекстВставки = ТекстЗапроса;
	КонецЕсли;
	Если ПустаяСтрока(ДополнительныеПараметры.ВыделенныйТекст) Тогда
		Объект.Текст = Объект.Текст + ТекстВставки;
		Элементы.ТекстАлгоритма.ОбновитьТекстРедактирования();
	Иначе
		Объект.Текст = СтрЗаменить(ДополнительныеПараметры.ВесьТекст, ДополнительныеПараметры.ВыделенныйТекст,
			ТекстВставки);
		Элементы.ТекстАлгоритма.ОбновитьТекстРедактирования();
	КонецЕсли;
	ВыделитьИзменившийсяКод();

КонецПроцедуры

&НаКлиенте
Функция ТипСлова(Слово, ТипыСлов)
	ТипСлова = Новый Соответствие;

	ТипСлова["ПереносСправа"] = ?(ТипыСлов[0].Найти(ВРег(СокрЛП(Слово))) = Неопределено, Ложь, Истина);
	ТипСлова["СкобкаОткрылась"] = ?(ТипыСлов[1].Найти(ВРег(СокрЛП(Слово))) = Неопределено, Ложь, Истина);
	ТипСлова["СкобкаЗакрылась"] = ?(ТипыСлов[2].Найти(ВРег(СокрЛП(Слово))) = Неопределено, Ложь, Истина);
	ТипСлова["СкобкаВнутри"] = ?(ТипыСлов[3].Найти(ВРег(СокрЛП(Слово))) = Неопределено, Ложь, Истина);
	Возврат ТипСлова;

КонецФункции

&НаСервере
Процедура ВыполнитьПроцедуруНаСервере(ОшибкаВыполнения = Ложь, СообщениеОбОшибке = "")
	ВыбОбъект = РеквизитФормыВЗначение("Объект");
	ДополнительныеПараметры = Новый Структура;
	ВыбОбъект.ВыполнитьПроцедуру(ДополнительныеПараметры);
	ОшибкаВыполнения = ДополнительныеПараметры.Отказ;
	СообщениеОбОшибке = ДополнительныеПараметры.СообщениеОбОшибке;
КонецПроцедуры

#КонецОбласти //------------------------------------- РАБОТАСКОДОМ

&НаСервере
Процедура ЗаполнитьСпискиВыбораПолейФормы()

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
				   |   УИ_АлгоритмыПараметры.ТипПараметра КАК ТипПараметра
				   |ИЗ
				   |   Справочник.УИ_Алгоритмы.Параметры КАК УИ_АлгоритмыПараметры";

	Выборка = Запрос.Выполнить().Выбрать();

	Пока Выборка.Следующий() Цикл

		Если Не ПустаяСтрока(Выборка.ТипПараметра) Тогда

			Элементы.ПрограммныйИнтерфейсТипПараметра.СписокВыбора.Добавить(СокрЛП(Выборка.ТипПараметра));
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры
&НаСервере
Процедура УстановитьВидимостьИДоступность()
	Элементы.ГруппаПанельСтраниц.Доступность = Не Параметры.Ключ.Пустая();

	Элементы.ОткрытьЖурналРегистрации.Заголовок = " ";

	//Элементы.ГрСервер.Видимость=Не Объект.НаКлиенте;
КонецПроцедуры

 
&НаКлиенте
Процедура ВыполнитьАлгоритмНаКлиенте(СтруктураПередачи)
	Если Не ЗначениеЗаполнено(СокрЛП(Объект.ТекстАлгоритма)) Тогда
		Возврат;
	КонецЕсли;
	Попытка
		КонтекстВыполнения = КонтекстВыполненияАлгоритма(СтруктураПередачи);
	Исключение
		ВызватьИсключение "Нет возможности получить на клиенте текущие параметры";
	КонецПопытки;
	РезультатВыполнения = УИ_РедакторКодаКлиентСервер.ВыполнитьАлгоритм(Объект.ТекстАлгоритма, КонтекстВыполнения);

КонецПроцедуры

&НаСервере
Процедура ВыполнитьАлгоритмНаСервере(СтруктураПередачи)
	Если Не ЗначениеЗаполнено(СокрЛП(Объект.ТекстАлгоритма)) Тогда
		Возврат;
	КонецЕсли;
	
	КонтекстВыполнения = КонтекстВыполненияАлгоритма(СтруктураПередачи);

	РезультатВыполнения = УИ_РедакторКодаКлиентСервер.ВыполнитьАлгоритм(Объект.ТекстАлгоритма, КонтекстВыполнения);

КонецПроцедуры

&НаСервере
Функция КонтекстВыполненияАлгоритма(СтруктураПередачи)
	КонтекстВыполнения = Новый Структура;
	КонтекстВыполнения.Вставить("СтруктураПередачи", СтруктураПередачи);
	
	ВыбОбъект = РеквизитФормыВЗначение("Объект");
	Переменные = ВыбОбъект.Хранилище.Получить();
	Если ЗначениеЗаполнено(Переменные) Тогда
		Для Каждого Элемент Из Переменные Цикл
			КонтекстВыполнения.Вставить(Элемент.Ключ, Элемент.Значение);
		КонецЦикла;
	КонецЕсли;
	
	Возврат КонтекстВыполнения;	
КонецФункции

#Область ИмпортЭкспорт
//Импорт
&НаКлиенте
Процедура ВнешнийФайлНачалоВыбораЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если (ТипЗнч(ВыбранныеФайлы) = Тип("Массив") И ВыбранныеФайлы.Количество() > 0) Тогда
		ВнешнийФайл = ВыбранныеФайлы[0];
		Каталог = Лев(ВнешнийФайл, СтрНайти(ВнешнийФайл, ПолучитьРазделительПути(), НаправлениеПоиска.СКонца));
		ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьПомещениеФайла", ЭтотОбъект, Новый Структура("Каталог",
			Каталог));
		НачатьПомещениеФайла(ОписаниеОповещения, , ВнешнийФайл, Ложь, ЭтотОбъект.УникальныйИдентификатор);
	Иначе
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Нет файла");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗакончитьПомещениеФайла(Результат, АдресХранилища, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	Если Результат Тогда
		ПрочитатьНаСервере(АдресХранилища, ВыбранноеИмяФайла, ДополнительныеПараметры);
	Иначе
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка помещения файла в хранилище");
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьНаСервере(АдресХранилища, ВыбранноеИмяФайла, ДополнительныеПараметры)
	НаименованиеПараметра = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Врег(ВыбранноеИмяФайла), Врег(
		ДополнительныеПараметры.Каталог), ""), ".", ""), "XML", ""), Символ(32), "");
	Попытка
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
		Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.ОткрытьПоток(Поток);
		ЗначениеПараметра = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
		ДобавитьНовыйПараметрНаСервере(Новый Структура("НаименованиеПараметра,ЗначениеПараметра",
			НаименованиеПараметра, ЗначениеПараметра));
	Исключение
		ВызватьИсключение "Ошибка записи файла XLM : " + ОписаниеОшибки();
	КонецПопытки;
КонецПроцедуры

//Экспорт
&НаКлиенте
Процедура ВыборКаталогаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если (ТипЗнч(ВыбранныеФайлы) = Тип("Массив") И ВыбранныеФайлы.Количество() > 0) Тогда
		Каталог = ВыбранныеФайлы[0];
		Параметр = Элементы.ТаблицаПараметров.ТекущиеДанные.Параметр;
		РасширениеФайла = "";
		ИмяФайла = СокрЛП(Параметр);
		Если ТипЗнч(ДополнительныеПараметры) = Тип("Структура") И ДополнительныеПараметры.Свойство("ВыгрузитьXML") Тогда
			РасширениеФайла = ".xml";
			АдресХранилища = ПолучитьФайлНаСервере(Параметр, Истина);
		Иначе
			Если СтрНайти(Параметр, "Файл") > 0 Тогда
				Поз = СтрНайти(ИмяФайла, "_");
				РасширениеФайла = "." + НРег(Сред(ИмяФайла, 5, Поз - 5));
				ИмяФайла = Сред(ИмяФайла, Поз + 1);
			КонецЕсли;
			АдресХранилища = ПолучитьФайлНаСервере(Параметр, Ложь);
		КонецЕсли;
		Оповещение = Новый ОписаниеОповещения("ПослеПолученияФайла", ЭтотОбъект);
		ОписаниеФайла = Новый ОписаниеПередаваемогоФайла;
		ОписаниеФайла.Хранение = АдресХранилища;
		ОписаниеФайла.Имя = Каталог + ПолучитьРазделительПути() + ИмяФайла + РасширениеФайла;
		ПолучаемыеФайлы = Новый Массив;
		ПолучаемыеФайлы.Добавить(ОписаниеФайла);
		НачатьПолучениеФайлов(Оповещение, ПолучаемыеФайлы, , Ложь);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьФайлНаСервере(Параметр, ВыгрузитьXML)
	ВыбПараметр = ПолучитьПараметрНаСервере(Параметр);
	Если ВыгрузитьXML Тогда
		ЗаписьXML = Новый ЗаписьXML;
		Поток = Новый ПотокВПамяти;
		ЗаписьXML.ОткрытьПоток(Поток);
		СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ВыбПараметр);
		ЗаписьXML.Закрыть();
		ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
		АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтотОбъект.УникальныйИдентификатор);
	Иначе
		АдресХранилища = ПоместитьВоВременноеХранилище(ВыбПараметр, ЭтотОбъект.УникальныйИдентификатор);
	КонецЕсли;
	Возврат АдресХранилища;
КонецФункции

&НаКлиенте
Процедура ПослеполученияФайла(ПолученныеФайлы, ДопПараметры) Экспорт
	Если ТипЗнч(ПолученныеФайлы) = Тип("Массив") Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл " + ПолученныеФайлы[0].Имя + " записан");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверкаПараметровПрограммныйИнтерфейс(Команда)
	Объект.Параметры.Очистить();
	КодАлгоритма = Объект.КодАлгоритма;
	мИсключая = УИ_АлгоритмыКлиентСервер.МассивИсключаемыхСимволов();
	Префикс = "Параметры.";
	Заполнение = Новый Структура;
	Пока Найти(КодАлгоритма, Префикс) > 0 Цикл
		Слово = УИ_АлгоритмыКлиентСервер.ПолучитьПервоеВхождениеСловоБезПрефикса(КодАлгоритма, Префикс, мИсключая);
		КодАлгоритма = СтрЗаменить(КодАлгоритма, Префикс + Слово, Слово);
		Попытка
			Заполнение.Вставить(Слово, Истина);
		Исключение
		КонецПопытки;
	КонецЦикла;
	Текст = Объект.Текст;
	Префикс = "$";
	Пока Найти(КодАлгоритма, Префикс) > 0 Цикл
		Слово = УИ_АлгоритмыКлиентСервер.ПолучитьПервоеВхождениеСловоБезПрефикса(Текст, Префикс, мИсключая);
		Текст = СтрЗаменить(Текст, Префикс + Слово, Слово);
		Попытка
			Заполнение.Вставить(Слово, Ложь);
		Исключение
		КонецПопытки;
	КонецЦикла;

	АдресХранилища = УИ_АлгоритмыКлиентСервер.ПолучитьПараметры(Объект.Ссылка, Истина);

	ХранимыеПараметры = ПолучитьИзВременногоХранилища(АдресХранилища);

	Для Каждого ЭлементСоответствия Из Заполнение Цикл
		НоваяСтрока = Объект.Параметры.Добавить();
		НоваяСтрока.Вход = ЭлементСоответствия.Значение;
		НоваяСтрока.Имя = ЭлементСоответствия.Ключ;
		Если НоваяСтрока.Вход И ХранимыеПараметры.Свойство(ЭлементСоответствия.Ключ) Тогда
			НоваяСтрока.ТипПараметра = ПолучитьСтрокуОписаниеТипа(ХранимыеПараметры[ЭлементСоответствия.Ключ]);
			НоваяСтрока.ПоУмолчанию = Строка(ХранимыеПараметры[ЭлементСоответствия.Ключ]);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

#КонецОбласти

&НаСервере
Процедура ПодключитьВнешнююОбработкуНаСервере()
	ВнешниеОбработки.Подключить("v8res://mngbase/StandardEventLog.epf", "StandardEventLog", False);
КонецПроцедуры

&НаСервере
Процедура СоздатьРегламентноеЗадание()
	Если Параметры.Ключ.Пустая() Тогда
		Возврат;
	КонецЕсли;
	МассивПараметров = Новый Массив;
	МассивПараметров.Добавить(Объект.Ссылка);
	Отбор = Новый Структура;
	Отбор.Вставить("Ключ", Объект.Ссылка.УникальныйИдентификатор());
	МассивЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
	Если МассивЗаданий.Количество() >= 1 Тогда
		Сообщить("Задание с  ключом " + Отбор.Ключ + " уже существует");
	Иначе
		Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание("alg_УниверсальноеРегламентноеЗадание");
		Задание.Наименование = Объект.Наименование;
		Задание.Ключ = Отбор.Ключ;
		Задание.Использование = Ложь;
		Задание.Параметры = МассивПараметров;
		Задание.Записать();
		Сообщить("Создано регламентное задание " + Объект.Наименование + " с  ключом " + Отбор.Ключ);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура УдалитьРегламентноеЗаданиеНаСервере()
	Если Параметры.Ключ.Пустая() Тогда
		Возврат;
	КонецЕсли;
	МассивПараметров = Новый Массив;
	МассивПараметров.Добавить(Объект.Ссылка);
	Отбор = Новый Структура;
	Отбор.Вставить("Ключ", Объект.Ссылка.УникальныйИдентификатор());
	МассивЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
	Если МассивЗаданий.Количество() >= 1 Тогда
		МассивЗаданий[0].Удалить();
		Сообщить("Удалено регламентное задание  " + Объект.Наименование);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	// РедакторКода
	УИ_РедакторКодаКлиент.ФормаПриОткрытии(ЭтотОбъект, Неопределено);
   	// РедакторКода
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ПолеРедактораДокументСформирован(Элемент)
	УИ_РедакторКодаКлиент.ПолеРедактораHTMLДокументСформирован(ЭтотОбъект, Элемент);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ПолеРедактораПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	УИ_РедакторКодаКлиент.ПолеРедактораHTMLПриНажатии(ЭтотОбъект, Элемент, ДанныеСобытия, СтандартнаяОбработка);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_РедакторКодаОтложеннаяИнициализацияРедакторов()
	УИ_РедакторКодаКлиент.РедакторКодаОтложеннаяИнициализацияРедакторов(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_РедакторКодаОтложеннаяОбработкаСобытийРедактора() Экспорт
	УИ_РедакторКодаКлиент.ОтложеннаяОбработкаСобытийРедактора(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте 
Процедура Подключаемый_РедакторКодаЗавершениеИнициализацииРедактора(ИдентификаторРедактора) Экспорт
	Если ИдентификаторРедактора <> "Алгоритм" Тогда
		Возврат;
	КонецЕсли;
	УИ_РедакторКодаКлиент.УстановитьТекстРедактора(ЭтотОбъект, "Алгоритм", Объект.ТекстАлгоритма, Истина);
КонецПроцедуры


&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	Объект.ТекстАлгоритма = УИ_РедакторКодаКлиент.ТекстКодаРедактора(ЭтотОбъект, "Алгоритм");
КонецПроцедуры

#КонецОбласти